/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.common.validation</code> contiene las clases
 * destinadas a la validación de los datos de un formulario.
 */
package edu.uoc.tds.pec4.common.validation;

import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * La clase <code>ValidarGUI</code> implementa una serie de métodos estáticos
 * que sirven para validar las entradas del usuario.<br />.
 *
 * Métodos estáticos para la validación de la GUI.<br />
 *
 * @author	Luis Rodríguez-Manzaneque Sánchez
 * @author      Luis Rivas Mariño
 * @version	01/12/2011
 * @since	1.00
 */
public class ValidarGUI {

    /**
     * Constructor de la clase.
     */
    public ValidarGUI() {
    }

    /**
     * Chequea que el parámetro sea un número entero.
     * @param   valor <code>String</code> que se va a chequear
     * @return  <code>true</code> si es un número entero, <code>false</code>
     *          en otro caso
     */
    public static boolean isInteger(String valor) {
        if (valor == null) {
            return false;
        }
        for (int n = 0; n < valor.length(); n++) {
            char c = valor.charAt(n);
            if ((c < '0') || (c > '9')) {
                return false;
            }
        }
        return true;
    }

    /**
     * Valida que el parámetro sea un número decimal.
     * @author  Luis Rivas Mariño
     * @param   num <code>String</code> que se va a chequear
     * @return  <code>true</code> si es un número entero, <code>false</code>
     *          en otro caso
     */
    public static boolean isDouble(String num) {
        if (num == null) {
            return false;
        }
        Pattern pa = Pattern.compile("^\\d+|^\\d+\\.?\\d+");
        Matcher m = pa.matcher(num);
        if (m.matches()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Evalúa que el número entero se encuentra dentro del rango
     * @param	numero es el valor <code>int</code> del que se quiere hacer la comprobación
     * @param	minimo rango inferior
     * @param	maximo rango superior
     * @return	<code>true</code> si el numero se encuentra dentro del rango, <code>false</code> en caso contrario
     */
    public static boolean isInRange(int numero, int minimo, int maximo) {
        if ((numero >= minimo) && (numero <= maximo)) {
            return true;
        }
        return false;
    }

    /**
     * Evalúa que el número decimal se encuentra dentro del rango
     * @param   numero es el valor <code>int</code> del que se quiere hacer la comprobación
     * @param	minimo rango inferior
     * @param	maximo rango superior
     * @return	<code>true</code> si el numero se encuentra dentro del rango, <code>false</code> en caso contrario
     */
    public static boolean isInRange(double numero, double minimo, double maximo) {
        if ((numero >= minimo) && (numero <= maximo)) {
            return true;
        }
        return false;
    }

    /**
     * Evalúa que la fecha de inicio es inferior a la fecha de fin
     * @param   fechaDesde es el valor <code>Date</code> de la fecha de comienzo
     * @param	fechaHasta es el valor <code>Date</code> de la fecha de fin
     * @return	<code>true</code> si la fecha de comienzo es anterior a la de fin, <code>false</code> en caso contrario
     */
    public static boolean datesInOrder(Date inicio, Date fin) {
        if (inicio.before(fin)) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * Comprueba los precios introducidos
     */
    public static boolean compruebaPrecios(String precio1, String precio2) {
        double p1 = Double.parseDouble(precio1);
        double p2 = Double.parseDouble(precio2);

        if (p1 > p2) {
            return true;
        }
        return false;
    }
    
 
    public static boolean validaNifNie(String nif) {

        //Si es NIE, elimina la X,Y,Z inicial para tratarlo como NIF
        if (nif.toUpperCase().startsWith("X") || nif.toUpperCase().startsWith("Y") || nif.toUpperCase().startsWith("Z")) {
            nif = nif.substring(1);
        }

        Pattern nifPattern = Pattern.compile("(\\d{1,8})([TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])");
        Matcher m = nifPattern.matcher(nif);

        if (m.matches()) {
            String letra = m.group(2);

            //Extrae letra del NIF
            String letras = "TRWAGMYFPDXBNJZSQVHLCKE";

            int dni = Integer.parseInt(m.group(1));
            dni = dni % 23;
            String dc = letras.substring(dni, dni + 1);

            if (dc.equalsIgnoreCase(letra)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /*
     * Valida correo electrónico
     */
    public boolean validaEmail(String correo) {
        Pattern eMailPattern = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
        Matcher m = eMailPattern.matcher(correo);
        if (m.find()) {
            return true;
        } else {
            return false;
        }
    }
}
